/*
 * jQuery liMarquee v 4.6
 *
 * Copyright 2013, Linnik Yura | LI MASS CODE | http://masscode.ru
 * http://masscode.ru/index.php/k2/item/44-limarquee
 * Free to use
 *
 * Last Update 20.11.2014
 */
(function ($) {
  var methods = {
    init: function (options) {
      var p = {
        direction: 'left', //Указывает направление движения содержимого контейнера (left | right | up | down)
        loop: -1, //Задает, сколько раз будет прокручиваться содержимое. "-1" для бесконечного воспроизведения движения
        scrolldelay: 0, //Величина задержки в миллисекундах между движениями
        scrollamount: 50, //Скорость движения контента (px/sec)
        circular: true, //Если "true" - строка непрерывная
        drag: true, //Если "true" - включено перетаскивание строки
        runshort: true, //Если "true" - короткая строка тоже "бегает", "false" - стоит на месте
        hoverstop: true, //true - строка останавливается при наведении курсора мыши, false - строка не останавливается
        inverthover: false, //false - стандартное поведение. Если "true" - строка начинает движение только при наведении курсора
        xml: false //Путь к xml файлу с нужным текстом
      };
      if (options) {
        $.extend(p, options);
      }

      return this.each(function () {
        var enterEvent = 'mouseenter';
        var leaveEvent = 'mouseleave';
        if (p.inverthover) {
          enterEvent = 'mouseleave';
          leaveEvent = 'mouseenter';
        }


        var
          loop = p.loop,
          strWrap = $(this).addClass('str_wrap').data({scrollamount: p.scrollamount}),
          fMove = false;


        var strWrapStyle = strWrap.attr('style');

        if (strWrapStyle) {
          var wrapStyleArr = strWrapStyle.split(';');
          var startHeight = false;
          for (var i = 0; i < wrapStyleArr.length; i++) {
            var str = $.trim(wrapStyleArr[i]);
            var tested = str.search(/^height/g);
            if (tested != -1) {
              startHeight = parseFloat(strWrap.css('height'));
            }
          }
        }

        var code = function () {

          strWrap.off('mouseleave');
          strWrap.off('mouseenter');
          strWrap.off('mousemove');
          strWrap.off('mousedown');
          strWrap.off('mouseup');


          if (!$('.str_move', strWrap).length) {
            strWrap.wrapInner($('<div>').addClass('str_move'));
          }

          var
            strMove = $('.str_move', strWrap).addClass('str_origin'),
            strMoveClone = strMove.clone().removeClass('str_origin').addClass('str_move_clone'),
            time = 0;

          if (!p.hoverstop) {
            strWrap.addClass('noStop');
          }

          var circCloneHor = function () {
            strMoveClone.clone().css({
              left: '100%',
              right: 'auto',
              width: strMove.width()
            }).appendTo(strMove);
            strMoveClone.css({
              right: '100%',
              left: 'auto',
              width: strMove.width()
            }).appendTo(strMove);
          }

          var circCloneVert = function () {
            strMoveClone.clone().css({
              top: '100%',
              bottom: 'auto',
              height: strMove.height()
            }).appendTo(strMove);
            strMoveClone.css({
              bottom: '100%',
              top: 'auto',
              height: strMove.height()
            }).appendTo(strMove);
          }


          if (p.direction == 'left') {
            strWrap.height(strMove.outerHeight())
            if (strMove.width() > strWrap.width()) {
              var leftPos = -strMove.width();

              if (p.circular) {

                if (!p.xml) {
                  circCloneHor()
                  leftPos = -(strMove.width() + (strMove.width() - strWrap.width()));
                }
              }
              if (p.xml) {
                strMove.css({
                  left: strWrap.width()
                })
              }
              var
                strMoveLeft = strWrap.width(),
                k1 = 0,
                timeFunc1 = function () {
                  var
                    fullS = Math.abs(leftPos),
                    time = (fullS / strWrap.data('scrollamount')) * 1000;
                  if (parseFloat(strMove.css('left')) != 0) {
                    fullS = (fullS + strWrap.width());
                    time = (fullS - (strWrap.width() - parseFloat(strMove.css('left')))) / strWrap.data('scrollamount') * 1000;
                  }
                  return time;
                },
                moveFuncId1 = false,
                moveFunc1 = function () {
                  if (loop != 0) {
                    strMove.stop(true).animate({
                      left: leftPos
                    }, timeFunc1(), 'linear', function () {
                      $(this).css({
                        left: strWrap.width()
                      });
                      if (loop == -1) {
                        moveFuncId1 = setTimeout(moveFunc1, p.scrolldelay);
                      } else {
                        loop--;
                        moveFuncId1 = setTimeout(moveFunc1, p.scrolldelay);
                      }
                    });
                  }
                };
              strWrap.data({
                moveId: moveFuncId1,
                moveF: moveFunc1
              })
              if (!p.inverthover) {
                moveFunc1();
              }

              if (p.hoverstop) {
                strWrap.on(enterEvent, function () {
                  $(this).addClass('str_active');
                  clearTimeout(moveFuncId1);
                  strMove.stop(true);
                }).on(leaveEvent, function () {
                  $(this).removeClass('str_active');
                  $(this).off('mousemove');
                  moveFunc1();
                });

                if (p.drag) {
                  strWrap.on('mousedown', function (e) {
                    if (p.inverthover) {
                      strMove.stop(true);
                    }
                    //drag
                    var dragLeft;
                    var dir = 1;
                    var newX;
                    var oldX = e.clientX;
                    //drag

                    strMoveLeft = strMove.position().left;
                    k1 = strMoveLeft - (e.clientX - strWrap.offset().left);


                    $(this).on('mousemove', function (e) {
                      fMove = true;

                      //drag
                      newX = e.clientX;
                      if (newX > oldX) {
                        dir = 1
                      } else {
                        dir = -1
                      }
                      oldX = newX
                      dragLeft = k1 + (e.clientX - strWrap.offset().left);

                      if (!p.circular) {
                        if (dragLeft < -strMove.width() && dir < 0) {
                          dragLeft = strWrap.width();
                          strMoveLeft = strMove.position().left;
                          k1 = strMoveLeft - (e.clientX - strWrap.offset().left);
                        }
                        if (dragLeft > strWrap.width() && dir > 0) {
                          dragLeft = -strMove.width();
                          strMoveLeft = strMove.position().left;
                          k1 = strMoveLeft - (e.clientX - strWrap.offset().left);
                        }
                      } else {
                        if (dragLeft < -strMove.width() && dir < 0) {
                          dragLeft = 0;
                          strMoveLeft = strMove.position().left;
                          k1 = strMoveLeft - (e.clientX - strWrap.offset().left);
                        }
                        if (dragLeft > 0 && dir > 0) {
                          dragLeft = -strMove.width();
                          strMoveLeft = strMove.position().left;
                          k1 = strMoveLeft - (e.clientX - strWrap.offset().left);
                        }

                      }


                      strMove.stop(true).css({
                        left: dragLeft
                      });
                      //drag


                    }).on('mouseup', function () {
                      $(this).off('mousemove');
                      if (p.inverthover) {
                        strMove.trigger('mouseenter')
                      }
                      setTimeout(function () {
                        fMove = false
                      }, 50)

                    });
                    return false;
                  })
                    .on('click', function () {
                      if (fMove) {
                        return false
                      }
                    });
                } else {
                  strWrap.addClass('no_drag');
                }
                ;
              }
            } else {
              if (p.runshort) {
                strMove.css({
                  left: strWrap.width()
                });
                var
                  strMoveLeft = strWrap.width(),
                  k1 = 0,
                  timeFunc = function () {
                    time = (strMove.width() + strMove.position().left) / strWrap.data('scrollamount') * 1000;
                    return time;
                  };
                var moveFunc = function () {
                  var leftPos = -strMove.width();
                  strMove.animate({
                    left: leftPos
                  }, timeFunc(), 'linear', function () {
                    $(this).css({
                      left: strWrap.width()
                    });
                    if (loop == -1) {
                      setTimeout(moveFunc, p.scrolldelay);
                    } else {
                      loop--;
                      setTimeout(moveFunc, p.scrolldelay);
                    }
                  });
                };
                strWrap.data({
                  moveF: moveFunc
                })
                if (!p.inverthover) {
                  moveFunc();
                }
                if (p.hoverstop) {
                  strWrap.on(enterEvent, function () {
                    $(this).addClass('str_active');
                    strMove.stop(true);
                  }).on(leaveEvent, function () {
                    $(this).removeClass('str_active');
                    $(this).off('mousemove');
                    moveFunc();
                  });

                  if (p.drag) {
                    strWrap.on('mousedown', function (e) {
                      if (p.inverthover) {
                        strMove.stop(true);
                      }

                      //drag
                      var dragLeft;
                      var dir = 1;
                      var newX;
                      var oldX = e.clientX;
                      //drag

                      strMoveLeft = strMove.position().left;
                      k1 = strMoveLeft - (e.clientX - strWrap.offset().left);
                      $(this).on('mousemove', function (e) {
                        fMove = true;


                        //drag
                        newX = e.clientX;
                        if (newX > oldX) {
                          dir = 1
                        } else {
                          dir = -1
                        }
                        oldX = newX
                        dragLeft = k1 + (e.clientX - strWrap.offset().left);

                        if (dragLeft < -strMove.width() && dir < 0) {
                          dragLeft = strWrap.width();
                          strMoveLeft = strMove.position().left;
                          k1 = strMoveLeft - (e.clientX - strWrap.offset().left);
                        }
                        if (dragLeft > strWrap.width() && dir > 0) {
                          dragLeft = -strMove.width();
                          strMoveLeft = strMove.position().left;
                          k1 = strMoveLeft - (e.clientX - strWrap.offset().left);
                        }


                        strMove.stop(true).css({
                          left: dragLeft
                        });


                      }).on('mouseup', function () {
                        if (p.inverthover) {
                          strMove.trigger('mouseenter')
                        }
                        $(this).off('mousemove');
                        setTimeout(function () {
                          fMove = false
                        }, 50)
                      });
                      return false;
                    })
                      .on('click', function () {
                        if (fMove) {
                          return false
                        }
                      });
                  } else {
                    strWrap.addClass('no_drag');
                  }
                  ;
                }
              } else {
                strWrap.addClass('str_static');
              }
            }
            ;
          }
          ;
          if (p.direction == 'right') {
            strWrap.height(strMove.outerHeight())
            strWrap.addClass('str_right');
            strMove.css({
              left: -strMove.width(),
              right: 'auto'
            })

            if (strMove.width() > strWrap.width()) {
              var leftPos = strWrap.width();
              strMove.css({
                left: 0
              })
              if (p.circular) {
                if (!p.xml) {
                  circCloneHor()
                  //Определяем крайнюю точку
                  leftPos = strMove.width();
                }
              }

              var
                k2 = 0;
              timeFunc = function () {
                var
                  fullS = strWrap.width(), //крайняя точка
                  time = (fullS / strWrap.data('scrollamount')) * 1000; //время
                if (parseFloat(strMove.css('left')) != 0) {
                  fullS = (strMove.width() + strWrap.width());
                  time = (fullS - (strMove.width() + parseFloat(strMove.css('left')))) / strWrap.data('scrollamount') * 1000;
                }
                return time;
              };
              var moveFunc = function () {

                if (loop != 0) {
                  strMove.animate({
                    left: leftPos
                  }, timeFunc(), 'linear', function () {
                    $(this).css({
                      left: -strMove.width()
                    });
                    if (loop == -1) {
                      setTimeout(moveFunc, p.scrolldelay);
                    } else {
                      loop--;
                      setTimeout(moveFunc, p.scrolldelay);
                    }
                    ;
                  });
                }
                ;
              };
              strWrap.data({
                moveF: moveFunc
              })

              if (!p.inverthover) {
                moveFunc();
              }
              if (p.hoverstop) {
                strWrap.on(enterEvent, function () {
                  $(this).addClass('str_active');
                  strMove.stop(true);
                }).on(leaveEvent, function () {
                  $(this).removeClass('str_active');
                  $(this).off('mousemove');
                  moveFunc();
                });

                if (p.drag) {

                  strWrap.on('mousedown', function (e) {
                    if (p.inverthover) {
                      strMove.stop(true);
                    }


                    //drag
                    var dragLeft;
                    var dir = 1;
                    var newX;
                    var oldX = e.clientX;
                    //drag

                    strMoveLeft = strMove.position().left;
                    k2 = strMoveLeft - (e.clientX - strWrap.offset().left);
                    $(this).on('mousemove', function (e) {

                      fMove = true;

                      //drag
                      newX = e.clientX;
                      if (newX > oldX) {
                        dir = 1
                      } else {
                        dir = -1
                      }
                      oldX = newX
                      dragLeft = k2 + (e.clientX - strWrap.offset().left);


                      if (!p.circular) {

                        if (dragLeft < -strMove.width() && dir < 0) {
                          dragLeft = strWrap.width();
                          strMoveLeft = strMove.position().left;
                          k2 = strMoveLeft - (e.clientX - strWrap.offset().left);
                        }
                        if (dragLeft > strWrap.width() && dir > 0) {
                          dragLeft = -strMove.width();
                          strMoveLeft = strMove.position().left;
                          k2 = strMoveLeft - (e.clientX - strWrap.offset().left);
                        }
                      } else {
                        if (dragLeft < -strMove.width() && dir < 0) {
                          dragLeft = 0;
                          strMoveLeft = strMove.position().left;
                          k2 = strMoveLeft - (e.clientX - strWrap.offset().left);
                        }
                        if (dragLeft > 0 && dir > 0) {
                          dragLeft = -strMove.width();
                          strMoveLeft = strMove.position().left;
                          k2 = strMoveLeft - (e.clientX - strWrap.offset().left);
                        }

                      }

                      strMove.stop(true).css({
                        left: dragLeft
                      });


                    }).on('mouseup', function () {
                      if (p.inverthover) {
                        strMove.trigger('mouseenter')
                      }
                      $(this).off('mousemove');
                      setTimeout(function () {
                        fMove = false
                      }, 50)
                    });
                    return false;
                  })
                    .on('click', function () {
                      if (fMove) {
                        return false
                      }
                    });
                } else {
                  strWrap.addClass('no_drag');
                }
                ;
              }
            } else {

              if (p.runshort) {

                var k2 = 0;
                var timeFunc = function () {
                  time = (strWrap.width() - strMove.position().left) / strWrap.data('scrollamount') * 1000;
                  return time;
                };
                var moveFunc = function () {
                  var leftPos = strWrap.width();
                  strMove.animate({
                    left: leftPos
                  }, timeFunc(), 'linear', function () {
                    $(this).css({
                      left: -strMove.width()
                    });
                    if (loop == -1) {
                      setTimeout(moveFunc, p.scrolldelay);
                    } else {
                      loop--;
                      setTimeout(moveFunc, p.scrolldelay);
                    }
                    ;
                  });
                };

                strWrap.data({
                  moveF: moveFunc
                })

                if (!p.inverthover) {
                  moveFunc();
                }
                if (p.hoverstop) {
                  strWrap.on(enterEvent, function () {
                    $(this).addClass('str_active');
                    strMove.stop(true);
                  }).on(leaveEvent, function () {
                    $(this).removeClass('str_active');
                    $(this).off('mousemove');
                    moveFunc();
                  });

                  if (p.drag) {
                    strWrap.on('mousedown', function (e) {
                      if (p.inverthover) {
                        strMove.stop(true);
                      }

                      //drag
                      var dragLeft;
                      var dir = 1;
                      var newX;
                      var oldX = e.clientX;
                      //drag

                      strMoveLeft = strMove.position().left;
                      k2 = strMoveLeft - (e.clientX - strWrap.offset().left);
                      $(this).on('mousemove', function (e) {
                        fMove = true;


                        //drag
                        newX = e.clientX;
                        if (newX > oldX) {
                          dir = 1
                        } else {
                          dir = -1
                        }
                        oldX = newX
                        dragLeft = k2 + (e.clientX - strWrap.offset().left);

                        if (dragLeft < -strMove.width() && dir < 0) {
                          dragLeft = strWrap.width();
                          strMoveLeft = strMove.position().left;
                          k2 = strMoveLeft - (e.clientX - strWrap.offset().left);
                        }
                        if (dragLeft > strWrap.width() && dir > 0) {
                          dragLeft = -strMove.width();
                          strMoveLeft = strMove.position().left;
                          k2 = strMoveLeft - (e.clientX - strWrap.offset().left);
                        }

                        strMove.stop(true).css({
                          left: dragLeft
                        });

                      }).on('mouseup', function () {
                        if (p.inverthover) {
                          strMove.trigger('mouseenter')
                        }
                        $(this).off('mousemove');
                        setTimeout(function () {
                          fMove = false
                        }, 50)
                      });
                      return false;
                    })
                      .on('click', function () {
                        if (fMove) {
                          return false
                        }
                      });
                  } else {
                    strWrap.addClass('no_drag');
                  }
                  ;
                }
              } else {
                strWrap.addClass('str_static');
              }
            }
            ;
          }
          ;
          if (p.direction == 'up') {
            strWrap.addClass('str_vertical');

            if (strMove.height() > strWrap.height()) {
              var topPos = -strMove.height();
              if (p.circular) {
                if (!p.xml) {
                  circCloneVert();
                  topPos = -(strMove.height() + (strMove.height() - strWrap.height()));
                }
              }
              if (p.xml) {
                strMove.css({
                  top: strWrap.height()
                })
              }
              var
                k2 = 0;
              timeFunc = function () {
                var
                  fullS = Math.abs(topPos),
                  time = (fullS / strWrap.data('scrollamount')) * 1000;
                if (parseFloat(strMove.css('top')) != 0) {
                  fullS = (fullS + strWrap.height());
                  time = (fullS - (strWrap.height() - parseFloat(strMove.css('top')))) / strWrap.data('scrollamount') * 1000;
                }

                return time;
              };
              var moveFunc = function () {
                if (loop != 0) {
                  strMove.animate({
                    top: topPos
                  }, timeFunc(), 'linear', function () {
                    $(this).css({
                      top: strWrap.height()
                    });
                    if (loop == -1) {
                      setTimeout(moveFunc, p.scrolldelay);
                    } else {
                      loop--;
                      setTimeout(moveFunc, p.scrolldelay);
                    }
                    ;
                  });
                }
                ;
              };

              strWrap.data({
                moveF: moveFunc
              })

              if (!p.inverthover) {
                moveFunc();
              }
              if (p.hoverstop) {
                strWrap.on(enterEvent, function () {
                  $(this).addClass('str_active');
                  strMove.stop(true);
                }).on(leaveEvent, function () {
                  $(this).removeClass('str_active');
                  $(this).off('mousemove');
                  moveFunc();
                });

                if (p.drag) {
                  strWrap.on('mousedown', function (e) {
                    if (p.inverthover) {
                      strMove.stop(true);
                    }

                    //drag
                    var dragTop;
                    var dir = 1;
                    var newY;
                    var oldY = e.clientY;
                    //drag


                    strMoveTop = strMove.position().top;
                    k2 = strMoveTop - (e.clientY - strWrap.offset().top);
                    $(this).on('mousemove', function (e) {

                      fMove = true;

                      //drag
                      newY = e.clientY;
                      if (newY > oldY) {
                        dir = 1
                      } else {
                        if (newY < oldY) {
                          dir = -1
                        }
                      }
                      oldY = newY
                      dragTop = k2 + e.clientY - strWrap.offset().top;


                      if (!p.circular) {
                        if (dragTop < -strMove.height() && dir < 0) {
                          dragTop = strWrap.height();
                          strMoveTop = strMove.position().top;
                          k2 = strMoveTop - (e.clientY - strWrap.offset().top);
                        }
                        if (dragTop > strWrap.height() && dir > 0) {
                          dragTop = -strMove.height();
                          strMoveTop = strMove.position().top;
                          k2 = strMoveTop - (e.clientY - strWrap.offset().top);
                        }
                      } else {
                        if (dragTop < -strMove.height() && dir < 0) {
                          dragTop = 0;
                          strMoveTop = strMove.position().top;
                          k2 = strMoveTop - (e.clientY - strWrap.offset().top);
                        }
                        if (dragTop > 0 && dir > 0) {
                          dragTop = -strMove.height();
                          strMoveTop = strMove.position().top;
                          k2 = strMoveTop - (e.clientY - strWrap.offset().top);
                        }
                      }


                      strMove.stop(true).css({
                        top: dragTop
                      });
                      //drag


                    }).on('mouseup', function () {
                      if (p.inverthover) {
                        strMove.trigger('mouseenter')
                      }
                      $(this).off('mousemove');
                      setTimeout(function () {
                        fMove = false
                      }, 50)
                    });
                    return false;
                  })
                    .on('click', function () {
                      if (fMove) {
                        return false
                      }
                    });
                } else {
                  strWrap.addClass('no_drag');
                }
                ;
              }
            } else {
              if (p.runshort) {
                strMove.css({
                  top: strWrap.height()
                });
                var k2 = 0;
                var timeFunc = function () {

                  time = (strMove.height() + strMove.position().top) / strWrap.data('scrollamount') * 1000;

                  return time;
                };
                var moveFunc = function () {
                  var topPos = -strMove.height();
                  strMove.animate({
                    top: topPos
                  }, timeFunc(), 'linear', function () {
                    $(this).css({
                      top: strWrap.height()
                    });
                    if (loop == -1) {
                      setTimeout(moveFunc, p.scrolldelay);
                    } else {
                      loop--;
                      setTimeout(moveFunc, p.scrolldelay);
                    }
                    ;
                  });
                };
                strWrap.data({
                  moveF: moveFunc
                })
                if (!p.inverthover) {
                  moveFunc();
                }
                if (p.hoverstop) {
                  strWrap.on(enterEvent, function () {
                    $(this).addClass('str_active');
                    strMove.stop(true);
                  }).on(leaveEvent, function () {
                    $(this).removeClass('str_active');
                    $(this).off('mousemove');
                    moveFunc();
                  });

                  if (p.drag) {
                    strWrap.on('mousedown', function (e) {
                      if (p.inverthover) {
                        strMove.stop(true);
                      }

                      //drag
                      var dragTop;
                      var dir = 1;
                      var newY;
                      var oldY = e.clientY;
                      //drag

                      strMoveTop = strMove.position().top;
                      k2 = strMoveTop - (e.clientY - strWrap.offset().top);
                      $(this).on('mousemove', function (e) {


                        fMove = true;

                        //drag
                        newY = e.clientY;
                        if (newY > oldY) {
                          dir = 1
                        } else {
                          if (newY < oldY) {
                            dir = -1
                          }
                        }
                        oldY = newY
                        dragTop = k2 + e.clientY - strWrap.offset().top;

                        if (dragTop < -strMove.height() && dir < 0) {
                          dragTop = strWrap.height();
                          strMoveTop = strMove.position().top;
                          k2 = strMoveTop - (e.clientY - strWrap.offset().top);
                        }
                        if (dragTop > strWrap.height() && dir > 0) {
                          dragTop = -strMove.height();
                          strMoveTop = strMove.position().top;
                          k2 = strMoveTop - (e.clientY - strWrap.offset().top);
                        }
                        //*drag

                        strMove.stop(true).css({
                          top: dragTop
                        });


                      }).on('mouseup', function () {
                        if (p.inverthover) {
                          strMove.trigger('mouseenter')
                        }
                        $(this).off('mousemove');
                        setTimeout(function () {
                          fMove = false
                        }, 50)
                      });
                      return false;
                    })
                      .on('click', function () {
                        if (fMove) {
                          return false
                        }
                      });
                  } else {
                    strWrap.addClass('no_drag');
                  }
                  ;
                }
              } else {
                strWrap.addClass('str_static');
              }
            }
            ;
          }
          ;
          if (p.direction == 'down') {

            strWrap.addClass('str_vertical').addClass('str_down');
            strMove.css({
              top: -strMove.height(),
              bottom: 'auto'
            })
            if (strMove.height() > strWrap.height()) {
              var topPos = strWrap.height();
              if (p.circular) {
                if (!p.xml) {
                  circCloneVert();
                  topPos = strMove.height();
                }
              }
              if (p.xml) {
                strMove.css({
                  top: -strMove.height()
                })
              }
              var
                k2 = 0;
              timeFunc = function () {
                var
                  fullS = strWrap.height(), //крайняя точка
                  time = (fullS / strWrap.data('scrollamount')) * 1000; //время

                if (parseFloat(strMove.css('top')) != 0) {
                  fullS = (strMove.height() + strWrap.height());
                  time = (fullS - (strMove.height() + parseFloat(strMove.css('top')))) / strWrap.data('scrollamount') * 1000;
                }
                return time;
              };
              var moveFunc = function () {

                if (loop != 0) {
                  strMove.animate({
                    top: topPos
                  }, timeFunc(), 'linear', function () {
                    $(this).css({
                      top: -strMove.height()
                    });
                    if (loop == -1) {

                      setTimeout(moveFunc, p.scrolldelay);
                    } else {
                      loop--;
                      setTimeout(moveFunc, p.scrolldelay);
                    }
                    ;
                  });
                }
                ;
              };
              strWrap.data({
                moveF: moveFunc
              })
              if (!p.inverthover) {
                moveFunc();
              }
              if (p.hoverstop) {
                strWrap.on(enterEvent, function () {
                  $(this).addClass('str_active');
                  strMove.stop(true);
                }).on(leaveEvent, function () {
                  $(this).removeClass('str_active');
                  $(this).off('mousemove');
                  moveFunc();
                });

                if (p.drag) {
                  strWrap.on('mousedown', function (e) {
                    if (p.inverthover) {
                      strMove.stop(true);
                    }

                    //drag
                    var dragTop;
                    var dir = 1;
                    var newY;
                    var oldY = e.clientY;
                    //drag


                    strMoveTop = strMove.position().top;
                    k2 = strMoveTop - (e.clientY - strWrap.offset().top);
                    $(this).on('mousemove', function (e) {

                      fMove = true;

                      //drag
                      newY = e.clientY;
                      if (newY > oldY) {
                        dir = 1
                      } else {
                        if (newY < oldY) {
                          dir = -1
                        }
                      }
                      oldY = newY
                      dragTop = k2 + e.clientY - strWrap.offset().top;


                      if (!p.circular) {
                        if (dragTop < -strMove.height() && dir < 0) {
                          dragTop = strWrap.height();
                          strMoveTop = strMove.position().top;
                          k2 = strMoveTop - (e.clientY - strWrap.offset().top);
                        }
                        if (dragTop > strWrap.height() && dir > 0) {
                          dragTop = -strMove.height();
                          strMoveTop = strMove.position().top;
                          k2 = strMoveTop - (e.clientY - strWrap.offset().top);
                        }
                      } else {
                        if (dragTop < -strMove.height() && dir < 0) {
                          dragTop = 0;
                          strMoveTop = strMove.position().top;
                          k2 = strMoveTop - (e.clientY - strWrap.offset().top);
                        }
                        if (dragTop > 0 && dir > 0) {
                          dragTop = -strMove.height();
                          strMoveTop = strMove.position().top;
                          k2 = strMoveTop - (e.clientY - strWrap.offset().top);
                        }
                      }


                      strMove.stop(true).css({
                        top: dragTop
                      });
                      //drag


                    }).on('mouseup', function () {
                      if (p.inverthover) {
                        strMove.trigger('mouseenter')
                      }
                      $(this).off('mousemove');
                      setTimeout(function () {
                        fMove = false
                      }, 50)
                    });
                    return false;
                  })
                    .on('click', function () {
                      if (fMove) {
                        return false
                      }
                    });
                } else {
                  strWrap.addClass('no_drag');
                }
                ;
              }
            } else {
              if (p.runshort) {
                var k2 = 0;
                var timeFunc = function () {
                  time = (strWrap.height() - strMove.position().top) / strWrap.data('scrollamount') * 1000;
                  return time;
                };
                var moveFunc = function () {
                  var topPos = strWrap.height();
                  strMove.animate({
                    top: topPos
                  }, timeFunc(), 'linear', function () {
                    $(this).css({
                      top: -strMove.height()
                    });
                    if (loop == -1) {
                      setTimeout(moveFunc, p.scrolldelay);
                    } else {
                      loop--;
                      setTimeout(moveFunc, p.scrolldelay);
                    }
                    ;
                  });
                };
                strWrap.data({
                  moveF: moveFunc
                })
                if (!p.inverthover) {
                  moveFunc();
                }
                if (p.hoverstop) {
                  strWrap.on(enterEvent, function () {
                    $(this).addClass('str_active');
                    strMove.stop(true);
                  }).on(leaveEvent, function () {
                    $(this).removeClass('str_active');
                    $(this).off('mousemove');
                    moveFunc();
                  });

                  if (p.drag) {
                    strWrap.on('mousedown', function (e) {
                      if (p.inverthover) {
                        strMove.stop(true);
                      }

                      //drag
                      var dragTop;
                      var dir = 1;
                      var newY;
                      var oldY = e.clientY;
                      //drag

                      strMoveTop = strMove.position().top;
                      k2 = strMoveTop - (e.clientY - strWrap.offset().top);
                      $(this).on('mousemove', function (e) {
                        fMove = true;

                        //drag
                        newY = e.clientY;
                        if (newY > oldY) {
                          dir = 1
                        } else {
                          if (newY < oldY) {
                            dir = -1
                          }
                        }
                        oldY = newY
                        dragTop = k2 + e.clientY - strWrap.offset().top;


                        if (dragTop < -strMove.height() && dir < 0) {
                          dragTop = strWrap.height();
                          strMoveTop = strMove.position().top;
                          k2 = strMoveTop - (e.clientY - strWrap.offset().top);
                        }
                        if (dragTop > strWrap.height() && dir > 0) {
                          dragTop = -strMove.height();
                          strMoveTop = strMove.position().top;
                          k2 = strMoveTop - (e.clientY - strWrap.offset().top);
                        }
                        //*drag

                        strMove.stop(true).css({
                          top: dragTop
                        });


                      }).on('mouseup', function () {
                        if (p.inverthover) {
                          strMove.trigger('mouseenter')
                        }
                        $(this).off('mousemove');
                        setTimeout(function () {
                          fMove = false
                        }, 50)
                      })
                      return false;
                    })
                      .on('click', function () {
                        if (fMove) {
                          return false
                        }
                      });
                  } else {
                    strWrap.addClass('no_drag');
                  }
                  ;
                }
              } else {
                strWrap.addClass('str_static');
              }
            }
            ;
          }
          ;


        }
        if (p.xml) {
          $.ajax({
            url: p.xml,
            dataType: "xml",
            success: function (xml) {
              var xmlTextEl = $(xml).find('text');
              var xmlTextLength = xmlTextEl.length;
              for (var i = 0; i < xmlTextLength; i++) {
                var xmlElActive = xmlTextEl.eq(i);
                var xmlElContent = xmlElActive.text();
                var xmlItemEl = $('<span>').text(xmlElContent).appendTo(strWrap);

                if (p.direction == 'left' || p.direction == 'right') {
                  xmlItemEl.css({display: 'inline-block', textAlign: 'right'});
                  if (i > 0) {
                    xmlItemEl.css({width: strWrap.width() + xmlItemEl.width()});
                  }
                }
                if (p.direction == 'down' || p.direction == 'up') {
                  xmlItemEl.css({display: 'block', textAlign: 'left'});
                  if (i > 0) {
                    xmlItemEl.css({paddingTop: strWrap.height()});
                  }
                }

              }
              code();
            }
          });
        } else {
          code();
        }
        strWrap.data({
          ini: code,
          startheight: startHeight
        })


      });
    },
    update: function () {
      var el = $(this);
      var str_origin = $('.str_origin', el);
      var str_move_clone = $('.str_move_clone', el);
      str_origin.stop(true);
      str_move_clone.remove();
      el.data('ini')();
    },
    destroy: function () {

      var el = $(this);
      var elMove = $('.str_move', el);
      var startHeight = el.data('startheight');

      $('.str_move_clone', el).remove();
      el.off('mouseenter');
      el.off('mousedown');
      el.off('mouseup');
      el.off('mouseleave');
      el.off('mousemove');
      el.removeClass('noStop').removeClass('str_vertical').removeClass('str_active').removeClass('no_drag').removeClass('str_static').removeClass('str_right').removeClass('str_down');

      var elStyle = el.attr('style');
      if (elStyle) {
        var styleArr = elStyle.split(';');
        for (var i = 0; i < styleArr.length; i++) {
          var str = $.trim(styleArr[i]);
          var tested = str.search(/^height/g);
          if (tested != -1) {
            styleArr[i] = '';
          }
        }
        var newArr = styleArr.join(';');
        var newStyle = newArr.replace(/;+/g, ';')

        if (newStyle == ';') {
          el.removeAttr('style');
        } else {
          el.attr('style', newStyle);
        }

        if (startHeight) {
          el.css({height: startHeight})
        }
      }
      elMove.stop(true);

      if (elMove.length) {
        var context = elMove.html();
        elMove.remove();
        el.html(context);
      }

    },
    pause: function () {
      var el = $(this);
      var elMove = $('.str_move', el);
      elMove.stop(true);
    },
    play: function () {
      var el = $(this);
      $(this).off('mousemove');
      el.data('moveF')();
    }

  };
  $.fn.liMarquee = function (method) {
    if (methods[method]) {
      return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
    } else if (typeof method === 'object' || !method) {
      return methods.init.apply(this, arguments);
    } else {
      $.error('Метод ' + method + ' в jQuery.liMarquee не существует');
    }
  };
})(jQuery);
